package com.markerhub.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.markerhub.common.lang.Result;
import com.markerhub.entity.SysDept;
import com.markerhub.service.SysDeptService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * 部门管理Controller
 */
@Api(tags = "部门管理")
@RestController
@RequestMapping("/api/sys-dept")
public class SysDeptController extends BaseController {

    @Autowired
    private SysDeptService sysDeptService;

    /**
     * 获取部门列表 - 分页
     */
    @PreAuthorize("hasAuthority('sys:dept:list')")
    @ApiOperation(value = "获取部门列表", notes = "获取所有部门信息，支持分页和模糊搜索")
    @GetMapping("/list")
    public Result list() {
        // 使用BaseController中的getPage()方法获取分页参数
        Page<SysDept> page = getPage();
        
        // 获取搜索参数
        String deptName = request.getParameter("dept_name");
        
        // 创建查询条件
        QueryWrapper<SysDept> queryWrapper = new QueryWrapper<>();
        
        // 如果有部门名称搜索条件，则添加模糊搜索
        if (deptName != null && !deptName.trim().isEmpty()) {
            queryWrapper.like("name", deptName);
        }
        
        // 执行分页查询
        Page<SysDept> pageData = sysDeptService.page(page, queryWrapper);
        return Result.succ(200, "获取部门列表成功", pageData);
    }

    /**
     * 查询部门 - 分页
     */
    @PreAuthorize("hasAuthority('sys:dept:list')")
    @ApiOperation(value = "查询部门", notes = "根据条件查询部门，支持模糊搜索")
    @GetMapping("/query")
    public Result query() {
        // 复用list方法的分页和搜索逻辑
        return list();
    }
    
    /**
     * 获取部门树
     */
    private List<SysDept> getDeptTree() {
        return sysDeptService.list();
    }

    /**
     * 获取部门详情
     */
    @PreAuthorize("hasAuthority('sys:dept:list')")
    @ApiOperation(value = "获取部门详情", notes = "根据ID获取部门详细信息")
    @GetMapping("/detail/{id}")
    public Result detail(@PathVariable Long id) {
        SysDept dept = sysDeptService.getById(id);
        return Result.succ(200, "获取部门信息成功", dept);
    }
    
    /**
     * 获取部门树
     */
    @PreAuthorize("hasAuthority('sys:dept:list')")
    @ApiOperation(value = "获取部门树", notes = "获取部门树形结构数据")
    @GetMapping("/tree")
    public Result tree() {
        List<SysDept> list = getDeptTree();
        return Result.succ(200, "获取部门树成功", list);
    }

    /**
     * 创建部门
     */
    @PreAuthorize("hasAuthority('sys:dept:add')")
    @ApiOperation(value = "创建部门", notes = "新增部门信息")
    @PostMapping("/add")
    public Result add(@RequestBody SysDept dept) {
        // 设置创建时间为当前时间
        dept.setCreated(new Date());
        boolean saved = sysDeptService.save(dept);
        return saved ? Result.succ(200, "创建部门成功", null) : Result.fail("创建部门失败");
    }

    /**
     * 更新部门
     */
    @PreAuthorize("hasAuthority('sys:dept:update')")
    @ApiOperation(value = "更新部门", notes = "更新部门信息")
    @PutMapping("/update")
    public Result update(@RequestBody SysDept dept) {
        // 设置更新时间为当前时间
        dept.setUpdated(new Date());
        boolean updated = sysDeptService.updateById(dept);
        return updated ? Result.succ(200, "更新部门成功", null) : Result.fail("更新部门失败");
    }

    /**
     * 删除部门（支持单删和批量删除）
     */
    @PreAuthorize("hasAuthority('sys:dept:delete')")
    @ApiOperation(value = "删除部门", notes = "根据ID删除单个部门")
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Long id) {
        boolean deleted = sysDeptService.removeById(id);
        return deleted ? Result.succ(200, "删除部门成功", null) : Result.fail("删除部门失败");
    }
    

}